在 RBAC 中有 4 個物件:
在 default 的 namespace 下建立 role,一個 role 可以有多個 rules。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: developer
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["pods"]
  verbs: ["get", "list", "create", "update", "delete"]
- apiGroups: [""]
  resources: ["deployments"]
  verbs: ["get", "list", "update"]
  resourceNames: ["new-deployment"] # 限制名稱為 new-deployment 的 deployment
apiVersion:RBAC 使用的 api version 為 rbac.authorization.k8s.io/v1
namespace:指的是在 namespace 為 default  的該資源apiGroups:空白指 core API group,或指定 group 名稱,如 example.com
resource:授權的資源,如 pods、deployments 或 jobs,* 表示所有資源verbs:可對資源進行何種操作,如 create (kubectl create -f pods.yaml) 取得 pods 資訊透過 rolebinding 將 user 連接 role。以下是 user-1 有 developer 的權限,在 default namespace 中進行 get pod、list、create 等操作,及可對 deployments 執行 get、list、update 動作。
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  namespace: default
  name: dev-user-binding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: developer
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: user-1
namespace:defaultroleRef
kind:Role 或 ClusterRole
name:要 binding 的物件名稱subjects:可以有一個或多個 users
name:名稱有分大小寫建立 role。
kubectl create -f dev-role.yaml
建立 roleBinding。
kubectl create -f dev-role-binding.yaml
另一種方式是透過以下指令建立 roleBinding。
kubectl create rolebinding dev-user-binding --role=developer --user=user-1
檢查自己有沒有被指定到該 role。
kubectl auth can-i list deployments --as developer
或是檢查其他 user 則使用以下指令。
kubectl list deployments --as user-1
對 node 來說不會僅限於某 namespace 中,node 是在叢集中存取(cluster-scope)的。也就是說資源可以分為以 namespace 存取、不能以 namespace 劃分(叢集範圍)存取兩種。
叢集範圍類別的資源包含:node、persistent volume、namespace、clusterroles 與 clsuterrolebindings 等。
若要查看 k8s 的資源可以透過
kubectl api-resources指令,會標示資源的namespace為true或false。
而 clusterRole 與 clusterRolebindings 就是賦予 user 叢集範圍資源的權限。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]
或是透過以下指令。
kubectl create clusterrole secret-reader --resource=secrets --verb=get,watch,list
manager 群組,使該群組可以讀取任何 namespace 下的 secrets。apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: secrets-user-cluster-role-binding
roleRef:
  kind: ClusterRole
  name: secret-reader
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
  name: manager
  apiGroup: rbac.authorization.k8s.io
或是透過以下指令。
kubectl create clusterrolebinding secrets-user-cluster-role-binding --clusterrole=secret-reader --user=manager
檢查有沒有設定成功。
kubectl get secrets --as manager
ClusterRole 也可以與 rolebinding 一起使用,因 rolebinding 是可以限制在某 namespace 中,故會變成該 namespace 下的 user 可以擁有叢集範圍資源的存取權限。